export default class VideoDeviceControl {
  constructor(wsConnection) {
    this.wsConnection = wsConnection; // 连接
    this.camidx = 0; // 摄像头索引
    this.picangle = 0; // 图片角度
    this.bSelected = 0; // 选择摄像头
    this.fignerIdx = 0; // 指纹索引
    this.canvasWidth = 640; // 默认值
    this.canvasHeight = 480; // 默认值
    this.canvasContext = null; // 画布上下文
    this.resolutionList = null; // 分辨率列表
    this.resolutionCallback = null; // 分辨率回调
    this.base64PictureCallback = null; // 拍照回调
    this.imageLoaded = false; // 添加标志位
  }

  /**
   * 设置分辨率回调函数
   * @param {Function} callback - 回调函数
   */
  setResolutionCallback(callback) {
    this.resolutionCallback = callback;
  }

  /**
   * 设置Base64图片回调函数
   * @param {Function} callback - 回调函数
   */
  setBase64PictureCallback(callback) {
    this.base64PictureCallback = callback;
  }

  /**
   * 设置画布
   * @param {HTMLCanvasElement} canvas - 画布元素
   */
  setCanvas(canvas) {
    this.canvasContext = canvas.getContext("2d");
    this.canvasWidth = canvas.width;
    this.canvasHeight = canvas.height;
  }

  /**
   * 开始视频
   */
  startVideo() {
    const command = {
      command: 10001,
      code: 1,
      camidx: this.camidx,
      autograp: 0, //  1:开启自动抓拍 0：关闭自动抓拍
      autocrop: 0, // 1:开启自动裁切 0：关闭自动
      videoCanvas_width: this.canvasWidth,
      videoCanvas_height: this.canvasHeight,
      videoformat: 2,
      bSelected: this.bSelected,
    };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 停止视频
   */
  stopVideo() {
    const command = { command: 10001, code: 0, camidx: 0 };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 设置分辨率
   * @param {Object} resolution - 分辨率对象
   * @param {number} resolution.type - 分辨率类型
   * @param {number} resolution.width - 分辨率宽度
   * @param {number} resolution.height - 分辨率高度
   */
  setResolution(resolution) {
    const command = {
      command: 10005,
      type: resolution.type,
      width: resolution.width,
      height: resolution.height,
    };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 拍摄图片并返回Base64编码
   */
  takePictureBase64() {
    const command = {
      command: 10003,
      quality: 75,
      angle: this.picangle,
      bShow: 1,
    };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 缩小视频画面
   */
  setZoomOut() {
    const command = { command: 10025 };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 放大视频画面
   */
  setZoomIn() {
    const command = { command: 10024 };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 设置图片旋转角度
   * @param {number} angle - 旋转角度（0, 1, 2, 3 分别代表 0°, 90°, 180°, 270°）
   */
  setAngle(angle) {
    const command = {
      command: 10009,
      angle: angle,
    };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 设置鼠标矩形区域
   * @param {number} x1 - 矩形左上角的 x 坐标
   * @param {number} y1 - 矩形左上角的 y 坐标
   * @param {number} x2 - 矩形右下角的 x 坐标
   * @param {number} y2 - 矩形右下角的 y 坐标
   */
  setMouseRect(x1, y1, x2, y2) {
    const command = {
      command: 10020, // 设置鼠标矩形区域的命令代码
      x1: x1,
      y1: y1,
      x2: x2,
      y2: y2,
    };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 设置移动点
   * @param {number} x - 移动点的 x 坐标
   * @param {number} y - 移动点的 y 坐标
   */
  setMovePoint(x, y) {
    const command = {
      command: 10028, // 设置移动点的命令代码
      x: x,
      y: y,
    };
    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 设置偏移点
   * @param {number} x - 偏移点的 x 坐标
   * @param {number} y - 偏移点的 y 坐标
   */
  setOffsetPoint(x, y) {
    const command = {
      command: 10027, // 设置偏移点的命令代码
      x: x, // x 坐标
      y: y, // y 坐标
    };
    this.wsConnection.send(JSON.stringify(command)); // 通过 WebSocket 发送命令
  }

  changeVideo() {
    this.camidx = this.camidx === 0 ? 1 : 0;

    const command = {
      command: 10001,
      code: 1,
      camidx: this.camidx,
      autograp: 0,
      autocrop: 0,
      videoCanvas_width: this.canvasWidth,
      videoCanvas_height: this.canvasHeight,
    };

    this.wsConnection.send(JSON.stringify(command));
  }

  /**
   * 处理 WebSocket 消息
   * @param {string} data - 接收到的消息数据
   */
  handleMessage(data) {
    try {
      const obj = JSON.parse(data); // 解析 JSON 数据
      switch (obj.command) {
        case 10001:
          console.log("10001", obj); // 处理命令 10001
          break;
        case 10009:
          console.log("10009", obj); // 处理命令 10009
          break;
        case 20000:
          this.handleResolutionList(obj); // 处理分辨率列表
          break;
        case 20001:
          this.handleVideoFrame(obj); // 处理视频帧
          break;
        case 20003:
          console.log("20003", obj); // 处理命令 20003
          this.handlePictureBase64(obj); // 处理 Base64 图片
          break;
        case 20007:
          console.log("20007", obj); // 处理命令 20007
          this.takePictureBase64(obj); // 拍摄 Base64 图片
          break;
        // 处理其他命令
      }
    } catch (error) {
      console.error("Error parsing message:", error); // 处理解析错误
    }
  }

  /**
   * 处理分辨率列表
   * @param {Object} obj - 包含分辨率列表的对象
   */
  handleResolutionList(obj) {
    this.resolutionList = obj;
    if (this.resolutionCallback) {
      this.resolutionCallback(this.resolutionList); // 调用回调函数并传递分辨率列表
    }
    // 实现设置分辨率列表的逻辑
  }

  /**
   * 处理Base64图片
   * @param {Object} obj - 包含Base64图片数据的对象
   */
  handlePictureBase64(obj) {
    // 回调base64获取回调
    if (this.base64PictureCallback) {
      this.base64PictureCallback(obj);
    }
  }

  /**
   * 处理视频帧
   * @param {Object} obj - 包含视频帧数据的对象
   */
  handleVideoFrame(obj) {
    if (this.canvasContext) {
      const img = new Image();
      img.onload = () => {
        this.canvasContext.drawImage(
          img,
          0,
          0,
          this.canvasWidth,
          this.canvasHeight
        );
      };
      img.src = "data:image/jpeg;base64," + obj.video;
      if (this.videoFrameCallback && !this.imageLoaded) {
        this.imageLoaded = true;
        this.videoFrameCallback(this.isImageLoaded());
      }
    } else {
      console.error("Canvas context is not set. Call setCanvas() first.");
    }
  }

  /**
   * 设置视频帧回调函数
   * @param {Function} callback - 回调函数
   */
  setVideoFrameCallback(callback) {
    this.videoFrameCallback = callback;
  }

  /**
   * 检查图像是否已加载
   * @returns {boolean} - 返回图像是否已加载
   */
  isImageLoaded() {
    return this.imageLoaded;
  }
}
